

#ifndef _USER_
#define _USER_

#include "poly.h"
#include "table.h"
#include <stdint.h>
#include "cloud.h"

#define SHARE_SIZE 6

typedef struct {
    int user_state; //用户的状态标识，当标识为1时表示在线，标识为0时表示不在线
    char name[50]; //用户的名称
    int User_symbol; //用户的标识符
    P_x *Px; //用于临时生成可用于计算的多项式
    HashTable *my_Hashtable; //用户自己手里的哈希表
    z_table *my_z_table; //用户自己持有的多项式部分表
    z_table *other_zx; //从其他用户处得到的秘密分享的z_x
    z_secret *secret_share_table; //用户生成自己z(x)函数的秘密分享值
    o_table *my_o_table; //用户准备发给云平台的，没有混淆的o(x)表
    roots_table *my_root_table; //用户生成哈希表的时候存储的根的表
    num_table *my_num_table; //用户存储在每个桶中有多少个元素
    o_hat_table *my_o_hat_table; // 用户发送给云平台的已经混淆的o_hat(x)表
    int label[TABLE_SIZE]; //用户的随机标识表
    int label_hat[TABLE_SIZE]; //混淆后的用户随机标识表
    int temp_label[TABLE_SIZE]; //用于接受其他用户发过来的随机标识表
    int label_matrix[2][TABLE_SIZE]; //用于生成标签对应矩阵;
    w_table *my_w_table; //用于存储求交时生成的随机多项式
    q_table *qtable; //用于存储求交时生成的RIE多项式
    rie_table *my_rie_table; //接收委托用户和云平台发送的隐私求交信息
    int shuffle_lable_matrix[2][TABLE_SIZE]; //这个结构负责记录，混淆完后的排列顺序与原始顺序之间的关联
    uint32_t user_hashseed; //这里用来存放每个桶公用的hash密钥
    my_secret_share_table *my_ss_table[6]; //创建一个暂存本用户生成的z(x)秘密分享的表格
    other_secret_share_table *other_ss_table; //创建一个接收其他用户sss的表
    int share_symbol[4][3]; //share_symbol表格里面记录了每个人拥有的份额标记
}User;


void getFromCloud(CloudServer *c, User *u, int randomId, int hashnum);//从云服务器获取对应的 o_hat(x)，和自己的z(x)结合以后，变成一个临时的P(x)

void divide_and_send_polynomial(CloudServer *c, User *u, int hashnum);//将P(x)秘密分享为两部分，并返回给云平台

long long power(long long x, int n);//求幂函数

#endif